home *** CD-ROM | disk | FTP | other *** search
/ Alde ADA 1: #1 / CCCC 8804 Volume 1 Number 1 - Alde.iso / C / MISC / FUNC / PROFF.ARC / EVAL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-02-21  |  1.6 KB  |  63 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include "proff.h"
  4. #include "debug.h"
  5.  
  6. /*
  7.  * eval - evaluate defined command (push back definition)
  8.  *
  9.  */
  10. eval(buf, defn)
  11. char buf[];
  12. char defn[];
  13. {
  14.    register int j, k;
  15.    int i;
  16.    int argptr[10];
  17.  
  18.    for (i = 0; i < 10; i++)
  19.       argptr[i] = 0;
  20.  
  21.    buf[0] = '\0';                      /* buf[0] is cchar */
  22.    dprintf(defn);
  23.    dprintf("eval  ");
  24.    i = 1;
  25.    argptr[0] = 1;                      /* first parm is macro name */
  26.    while (buf[i] != ' ' && buf[i] != '\t' && buf[i] != '\n' && buf[i] != '\0')
  27.       i++;
  28.    buf[i++] = '\0';                    /* EOS terminate */
  29.    /*
  30.     * start scanning remaining macro parameters. delimiters are blanks or
  31.     * commas. Any string enclosed with double quotes are accepted as parameters
  32.     * as well 
  33.     */
  34.    for (j = 1; j < 10; j++)
  35.    {
  36.       skipbl(buf, &i);
  37.       if (buf[i] == '\n' || buf[i] == '\0')
  38.          break;
  39.       argptr[j] = i;
  40.       while (buf[i] != ' ' && buf[i] != '\t' && buf[i] != ',' && buf[i] != '\n' && buf[i] != '\0')
  41.          i++;
  42.       buf[i] = '\0';
  43.       i++;
  44.    }
  45.    for (k = strlen(defn) - 1; k >= 0; k--)
  46.       if (defn[k - 1] != ARGFLAG)
  47.          putbak(defn[k]);
  48.       else
  49.       {
  50.          if (defn[k] < '0' || defn[k] > '9')
  51.             putbak(defn[k]);
  52.          else
  53.          {
  54.             i = defn[k] - '0';
  55.             i = argptr[i];
  56.             pbstr(&buf[i]);
  57.             k--;                       /* skip over $ */
  58.          }
  59.       }
  60.    if (k = 0)                          /* do the last character */
  61.       putbak(defn[k]);
  62. }
  63.